{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/mnt/workspace/mdy/miniforge/envs/mdy/lib/python3.10/site-packages/_distutils_hack/__init__.py:53: UserWarning: Reliance on distutils from stdlib is deprecated. Users must rely on setuptools to provide the distutils module. Avoid importing distutils or import setuptools first, and avoid setting SETUPTOOLS_USE_DISTUTILS=stdlib. Register concerns at https://github.com/pypa/setuptools/issues/new?template=distutils-deprecation.yml\n",
      "  warnings.warn(\n"
     ]
    }
   ],
   "source": [
    "import torch\n",
    "import triton\n",
    "import triton.language as tl"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# code\n",
    "- 一个比内置max还快的函数,只限于输入是连续的张量，在axis=-1进行比较，否则速度特别慢。目前还不知道怎么优化，欢迎讨论\n",
    "- 真正行级别的算法，大家看完后，可以试试min函数怎么实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "class VALUES_INDICES:\n",
    "    def __init__(self, values, indices, func_type):\n",
    "        self.values = values\n",
    "        self.indices = indices\n",
    "        self.func_type = func_type\n",
    "\n",
    "    def __str__(self):\n",
    "        return f\"func_type={self.func_type}\\nvalues={self.values}\\nindices={self.indices})\"\n",
    "    \n",
    "    def __repr__(self):\n",
    "        return f\"func_type={self.func_type}\\nvalues={self.values}\\nindices={self.indices})\"\n",
    "\n",
    "@triton.jit\n",
    "def _max_short(INPUT, VALUES, INDICES,\n",
    "          stride0, stride1,\n",
    "          M, N: tl.constexpr, \n",
    "          BLOCK_M: tl.constexpr, BLOCK_N: tl.constexpr):\n",
    "    \n",
    "    start_m = tl.program_id(0)\n",
    "    row_offset = start_m * BLOCK_M\n",
    "    rows = tl.arange(0, BLOCK_M)\n",
    "    cols = tl.arange(0, BLOCK_N)\n",
    "    input_ptrs = INPUT + row_offset * stride0 +  rows[:, None] * stride0 + cols[None, :] * stride1\n",
    "    mask_row = (row_offset + rows) < M\n",
    "    mask_col = cols < N\n",
    "    mask = mask_row[:, None] & mask_col[None, :]\n",
    "    inp = tl.load(input_ptrs, mask=mask, other=float('-inf'))\n",
    "    max_num, index = tl.max(inp, -1, return_indices=True)\n",
    "    output_ptrs = VALUES + row_offset + rows\n",
    "    tl.store(output_ptrs, max_num, mask=mask_row)\n",
    "    indices_ptrs = INDICES + row_offset + rows\n",
    "    tl.store(indices_ptrs, index, mask=mask_row)\n",
    "\n",
    "@triton.jit\n",
    "def _max_long(INPUT, VALUES, INDICES,\n",
    "          stride0, stride1,\n",
    "          M, N: tl.constexpr, \n",
    "          BLOCK_N: tl.constexpr):\n",
    "    start_m = tl.program_id(0)\n",
    "    base_ptrs = INPUT + start_m * stride0\n",
    "\n",
    "    cols = tl.arange(0, BLOCK_N)\n",
    "    INPUT_ptrs = base_ptrs + cols * stride1\n",
    "    mask = tl.arange(0, BLOCK_N) < N\n",
    "    inp = tl.load(INPUT_ptrs, mask=mask)\n",
    "    max_num, indices = tl.max(inp, 0, return_indices=True)  \n",
    "\n",
    "    for start_n in range(BLOCK_N, N, BLOCK_N):\n",
    "        new_cols = cols + start_n\n",
    "        INPUT_ptrs = base_ptrs + new_cols * stride1\n",
    "        mask = new_cols < N\n",
    "        inp = tl.load(INPUT_ptrs, mask=mask)\n",
    "        new_max_num, new_indices = tl.max(inp, 0, return_indices=True)  \n",
    "        if new_max_num > max_num:\n",
    "            max_num = new_max_num\n",
    "            indices = start_n + new_indices\n",
    "        \n",
    "\n",
    "    tl.store(VALUES + start_m, max_num)\n",
    "    tl.store(INDICES + start_m, indices)\n",
    "\n",
    "def triton_max(tensor, axis=-1, keepdim=False):\n",
    "    tensor = torch.movedim(tensor, axis, -1)\n",
    "    tensor_shape = tensor.shape\n",
    "    tensor = tensor.reshape(-1, tensor_shape[-1])\n",
    "    # print(tensor.stride())\n",
    "    B,D = tensor.shape\n",
    "    values = torch.empty(B, device=tensor.device, dtype=tensor.dtype)\n",
    "    indices = torch.empty(B, device=tensor.device, dtype=torch.int64)\n",
    "    if D <=256:\n",
    "        tmp = triton.next_power_of_2(B)\n",
    "        BLOCK_M= min(256, tmp)\n",
    "        BLOCK_N=triton.next_power_of_2(D)\n",
    "        grid = lambda meta: (triton.cdiv(B, meta['BLOCK_M']),)\n",
    "        _max_short[grid](tensor, values, indices,\n",
    "                tensor.stride(0),tensor.stride(1),\n",
    "                    B,D,\n",
    "                    BLOCK_M=BLOCK_M, BLOCK_N=BLOCK_N,\n",
    "                    num_stages=4, num_warps=8\n",
    "        )\n",
    "    else:\n",
    "        BLOCK_N = min(triton.next_power_of_2(D), 2048)\n",
    "        _max_long[(B,)](tensor, values, indices, \n",
    "                tensor.stride(0),tensor.stride(1),\n",
    "                    B,D,\n",
    "                    BLOCK_N=BLOCK_N,\n",
    "                    num_stages=4, num_warps=8\n",
    "        )\n",
    "    values = values.reshape(*tensor_shape[:-1])\n",
    "    indices = indices.reshape(*tensor_shape[:-1])\n",
    "    if keepdim:\n",
    "        values.unsqueeze_(axis)\n",
    "    return VALUES_INDICES(values=values, indices=indices, func_type='triton_max')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "True\n",
      "True\n",
      "True\n"
     ]
    }
   ],
   "source": [
    "x = torch.randn(64,64,64).cuda().to(torch.float16)\n",
    "print(torch.allclose(triton_max(x, 0).values, x.max(0).values))\n",
    "print(torch.allclose(triton_max(x, -1).indices, x.max(-1).indices))\n",
    "x = torch.randn(8,1, 64*1024).cuda().to(torch.float16)\n",
    "print(torch.allclose(triton_max(x, -1).values, x.max(-1).values))\n",
    "print(torch.allclose(triton_max(x, -1).indices, x.max(-1).indices))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 大dim benchmark"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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yJMnjxEWFmYYhs7bvezcudPIli2b8Z///Mc4ceKE8c033xienp7G/PnzHcdkpO8JhaOHMHXqVKNIkSKGu7u78cQTTxjbt2+3uqQ0s3HjRgP416NTp06GYZi3aQ4fPtzIly+f4eHhYdSrV884fvx4kte4cuWK0aZNG8PLy8vw8fExunTpYkRGRiY55rfffjOeeuopw8PDwyhYsKAxfvz4f9Xyv//9zyhVqpTh7u5ulC9f3lixYkWafe7UcKfzBhizZs1yHHPz5k2jd+/eRq5cuQxPT0+jZcuWRkhISJLXOXPmjNGoUSMjR44cRp48eYw333zTiI+PT3LMxo0bjccee8xwd3c3Hn300STvcUtG+bnt2rWrUbRoUcPd3d3ImzevUa9ePUcwMgydswfxz3Ckc3dnr7zyipE/f37D3d3dKFiwoPHKK68kmadH5+3eli1bZlSoUMHw8PAwypQpY/z3v/9Nsj8jfU/YDMMwkt/PJCIiIpK5acyRiIiIyG0UjkRERERuo3AkIiIichuFIxEREZHbKByJiIiI3EbhSEREROQ2CkciIiIit1E4EhEREbmNwpGIZAp16tRhwIABADzyyCNMnjzZ0npEJOPKZnUBIiKpbdeuXeTMmdPqMkQkg1I4EpFMJ2/evFaXICIZmC6riUiGEx0dTceOHfHy8iJ//vx88sknSfb/87KazWbjyy+/5IUXXsDT05OyZcuybds2Tp48SZ06dciZMye1atXi1KlT6fxJRMQZKRyJSIYzePBgNm3axJIlS1i7di3BwcHs3bv3ns95//336dixI/v376dMmTK0bduW119/nWHDhrF7924Mw6Bv377p9AlExJnpspqIZChRUVHMmDGD+fPnU69ePQDmzJlDoUKF7vm8Ll268PLLLwMwZMgQatasyfDhwwkKCgLgjTfeoEuXLmlbvIhkCOo5EpEM5dSpU8TFxVGjRg3Htty5c1O6dOl7Pq9SpUqOP+fLlw+AihUrJtkWExNDREREKlcsIhmNwpGIZAlubm6OP9tstrtus9vt6VuYiDgdhSMRyVCKFy+Om5sbO3bscGy7du0av//+u4VViUhmojFHIpKheHl50a1bNwYPHoy/vz8BAQG8++67uLjo33oikjoUjkQkw5kwYQJRUVE0bdoUb29v3nzzTcLDw60uS0QyCZthGIbVRYiIiIg4C/VDi4iIiNxG4UhERETkNgpHIiIiIrdROBIRERG5jcKRiIiIyG0UjkRERERuo3AkIiIichuFIxEREZHbKByJiIiI3EbhSEREROQ2CkciIiIit/k/Dv5LAymBsGsAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "triton max:\n",
      "       dim  Triton_max   Torch_max\n",
      "0   1024.0   15.671197   22.181587\n",
      "1   9216.0   44.731263   61.220683\n",
      "2  17408.0   67.496374   87.304540\n",
      "3  25600.0   88.738292  113.300592\n",
      "4  33792.0  110.158131  139.631405\n",
      "5  41984.0  131.179675  164.702311\n",
      "6  50176.0  161.465436  191.367984\n",
      "7  58368.0  172.628328  212.930188\n"
     ]
    }
   ],
   "source": [
    "torch.cuda.empty_cache()\n",
    "@triton.testing.perf_report(\n",
    "    triton.testing.Benchmark(\n",
    "        x_names=['dim'],  # argument names to use as an x-axis for the plot\n",
    "        x_vals=[1024 * i for i in range(1, 64+1, 8)],  # different possible values for `x_name`\n",
    "        line_arg='provider',  # argument name whose value corresponds to a different line in the plot\n",
    "        line_vals=['triton', 'torch'],  # possible values for `line_arg``\n",
    "        line_names=[\n",
    "            \"Triton_max\",\n",
    "            \"Torch_max\",\n",
    "        ],  # label name for the lines\n",
    "        styles=[('blue', '-'), ('green', '-')],  # line styles\n",
    "        ylabel=\"ms\",  # label name for the y-axis\n",
    "        plot_name=\"triton max\",  # name for the plot. Used also as a file name for saving the plot.\n",
    "        args={'bs': 2048, 'axis': -1}\n",
    "    ))\n",
    "def benchmark(bs, dim, axis, provider):\n",
    "    device = torch.device('cuda')\n",
    "    dtype = torch.float16\n",
    "    tensor = torch.randn(bs, dim).to(device).to(dtype)\n",
    "\n",
    "    stream = torch.cuda.Stream()\n",
    "    torch.cuda.set_stream(stream)\n",
    "    if provider == 'triton':\n",
    "        ms = triton.testing.do_bench(lambda: triton_max(tensor, axis))\n",
    "\n",
    "    if provider == 'torch':\n",
    "        # ms = triton.testing.do_bench(lambda: torch.max(tensor, 2))\n",
    "        ms = triton.testing.do_bench(lambda: torch.max(tensor, axis))\n",
    "\n",
    "    return ms * 1e3\n",
    "benchmark.run(show_plots=True, print_data=True)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 小dim benchmark"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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PJ3MWMP7+CIqIYQwbt0PERERkfGU2D4zREREZB2YzBAREZFFYzJDREREFo3JDBEREVk0JjNERERk0ZjMEBERkUVjMkNEREQWjckMERERWTQmM0Rk9tq1a4dp06YpHQYRmSkmM0RERGTRmMwQERGRRWMyQ0QWIScnB1OmTIGnpyfKli2LTz75BNql5X788UfUqFEDTk5O8Pb2Rr9+/RSOlohMyU7pAIiICmL16tUYM2YMTp8+jbNnz2L8+PEICAhAcHAwpk6dijVr1qBVq1Z4/Pgxjhw5onS4RGRCXDWbiMxeu3btEBsbi8uXL0OlUgEAZs6ciW3btuGLL77AqFGjcO/ePbi7uyscKREpgc1MRGQRWrRooUtkAKBly5YIDw9H+/btUalSJVStWhXDhg3DunXrkJaWpmCkRGRqTGaIyKK5ubkhJCQE69evh6+vLz799FM0aNAACQkJSodGRCbCZIaILMKpU6f0fj558iRq1KgBW1tb2NnZoUOHDpg7dy4uXryIu3fv4p9//lEoUiIyNXYAJiKLEBkZienTp2PChAkICQnBggUL8M0332D79u24ffs22rZtCy8vL+zcuRMajQaBgYFKh0xEJsJkhogswvDhw5Geno5mzZrB1tYW7777LsaPH49jx45h8+bNmDVrFjIyMlCjRg2sX78edevWVTpkIjIRjmYiIiIii8Y+M0RERGTRmMwQERGRRWMyQ0RERBaNyQwRERFZNCYzREREZNGYzBAREZFFYzJDREREFo3JDBEREVk0JjNERERk0ZjMEBERkUVjMkNEREQW7f8BnT4GLNDDAQAAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "triton max:\n",
      "         bs  Triton_max  Torch_max\n",
      "0    1280.0    9.478737  10.699689\n",
      "1    2560.0    7.258985  10.489408\n",
      "2    3840.0    7.834785  10.495137\n",
      "3    5120.0    7.722017   9.949663\n",
      "4    6400.0    7.314828  10.036972\n",
      "5    7680.0    7.285718  10.548987\n",
      "6    8960.0    7.764371  10.599965\n",
      "7   10240.0    7.852366  10.050445\n",
      "8   11520.0    7.811560  10.138834\n",
      "9   12800.0    7.275918  10.208091\n",
      "10  14080.0    7.304145  10.256880\n",
      "11  15360.0    7.833573  10.344934\n",
      "12  16640.0    7.799591  11.052709\n",
      "13  17920.0    7.887492  10.492605\n",
      "14  19200.0    7.369733  10.571163\n",
      "15  20480.0    7.461785  11.272352\n",
      "16  21760.0    7.419895  10.714352\n",
      "17  23040.0    7.476183  10.688854\n",
      "18  24320.0    7.999077  10.656222\n",
      "19  25600.0    7.785724  10.750340\n",
      "20  26880.0    7.510856  11.288428\n",
      "21  28160.0    8.040230  11.548323\n",
      "22  29440.0    7.470085  11.091028\n",
      "23  30720.0    7.536130  11.782599\n",
      "24  32000.0    7.548786  11.774011\n",
      "25  33280.0    8.146740  11.264733\n",
      "26  34560.0    8.144552  11.267535\n",
      "27  35840.0    7.580082  11.278162\n",
      "28  37120.0    7.619388  11.998487\n",
      "29  38400.0    7.621502  11.373149\n",
      "30  39680.0    8.175031  11.517660\n",
      "31  40960.0    8.253928  12.254733\n"
     ]
    }
   ],
   "source": [
    "torch.cuda.empty_cache()\n",
    "@triton.testing.perf_report(\n",
    "    triton.testing.Benchmark(\n",
    "        x_names=['bs'],  # argument names to use as an x-axis for the plot\n",
    "        x_vals=[1280 * i for i in range(1, 32+1)],  # different possible values for `x_name`\n",
    "        line_arg='provider',  # argument name whose value corresponds to a different line in the plot\n",
    "        line_vals=['triton', 'torch'],  # possible values for `line_arg``\n",
    "        line_names=[\n",
    "            \"Triton_max\",\n",
    "            \"Torch_max\",\n",
    "        ],  # label name for the lines\n",
    "        styles=[('blue', '-'), ('green', '-')],  # line styles\n",
    "        ylabel=\"ms\",  # label name for the y-axis\n",
    "        plot_name=\"triton max\",  # name for the plot. Used also as a file name for saving the plot.\n",
    "        args={'dim': 4, 'axis': -1}\n",
    "    ))\n",
    "def benchmark(bs, dim, axis, provider):\n",
    "    device = torch.device('cuda')\n",
    "    dtype = torch.float16\n",
    "    tensor = torch.randn(bs, dim).to(device).to(dtype)\n",
    "\n",
    "    stream = torch.cuda.Stream()\n",
    "    torch.cuda.set_stream(stream)\n",
    "    if provider == 'triton':\n",
    "        ms = triton.testing.do_bench(lambda: triton_max(tensor, axis))\n",
    "\n",
    "    if provider == 'torch':\n",
    "        # ms = triton.testing.do_bench(lambda: torch.max(tensor, 2))\n",
    "        ms = triton.testing.do_bench(lambda: torch.max(tensor, axis))\n",
    "\n",
    "    return ms * 1e3\n",
    "benchmark.run(show_plots=True, print_data=True)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "triton max:\n",
      "        bs  Triton_max   Torch_max\n",
      "0   1280.0   16.154224   40.834486\n",
      "1   6400.0   24.137581  110.124141\n",
      "2  11520.0   36.327973  145.761341\n",
      "3  16640.0   91.840588  179.990873\n",
      "4  21760.0   96.974500  213.319138\n",
      "5  26880.0   95.367901  246.671915\n",
      "6  32000.0   94.138935  279.642344\n",
      "7  37120.0  152.073503  312.511355\n"
     ]
    }
   ],
   "source": [
    "torch.cuda.empty_cache()\n",
    "@triton.testing.perf_report(\n",
    "    triton.testing.Benchmark(\n",
    "        x_names=['bs'],  # argument names to use as an x-axis for the plot\n",
    "        x_vals=[1280 * i for i in range(1, 32+1, 4)],  # different possible values for `x_name`\n",
    "        line_arg='provider',  # argument name whose value corresponds to a different line in the plot\n",
    "        line_vals=['triton', 'torch'],  # possible values for `line_arg``\n",
    "        line_names=[\n",
    "            \"Triton_max\",\n",
    "            \"Torch_max\",\n",
    "        ],  # label name for the lines\n",
    "        styles=[('blue', '-'), ('green', '-')],  # line styles\n",
    "        ylabel=\"ms\",  # label name for the y-axis\n",
    "        plot_name=\"triton max\",  # name for the plot. Used also as a file name for saving the plot.\n",
    "        args={'dim': 4096, 'axis': 0}\n",
    "    ))\n",
    "def benchmark(bs, dim, axis, provider):\n",
    "    device = torch.device('cuda')\n",
    "    dtype = torch.float16\n",
    "    tensor = torch.randn(bs, dim).to(device).to(dtype)\n",
    "\n",
    "    stream = torch.cuda.Stream()\n",
    "    torch.cuda.set_stream(stream)\n",
    "    if provider == 'triton':\n",
    "        ms = triton.testing.do_bench(lambda: triton_max(tensor, axis))\n",
    "\n",
    "    if provider == 'torch':\n",
    "        # ms = triton.testing.do_bench(lambda: torch.max(tensor, 2))\n",
    "        ms = triton.testing.do_bench(lambda: torch.max(tensor, axis))\n",
    "\n",
    "    return ms * 1e3\n",
    "benchmark.run(show_plots=True, print_data=True)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
